﻿/*!	@file	r_draw_def.h
	@brief	描画システム定義
Copyright (c) 2010 Yuya Yamaguchi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef _R_DRAW_DEF_H_
#define _R_DRAW_DEF_H_

#include "../r_type.h"

namespace r{
	namespace draw{
		//! テクスチャフォーマット
		enum ImageFormat {
			ImageFormat_Unknown = 0,
			ImageFormat_RGBA32_F,			//!< RGBA32bit浮動小数
			ImageFormat_RGBA32_U,			//!< RGBA32bit符号なし整数
			ImageFormat_RGBA32_S,			//!< RGBA32bit符号あり整数
			ImageFormat_RGB32_F,			//!< RGB32bit浮動小数
			ImageFormat_RGB32_U,			//!< RGB32bit符号なし整数
			ImageFormat_RGB32_S,			//!< RGB32bit符号あり整数
			ImageFormat_RGBA16_F,			//!< RGBA16bit浮動小数
			ImageFormat_RGBA16_UN,			//!< RGBA16bit符号なし正規化整数
			ImageFormat_RGBA16_U,			//!< RGBA16bit符号なし整数
			ImageFormat_RGBA16_SN,			//!< RGBA16bit符号あり正規化整数
			ImageFormat_RGBA16_S,			//!< RGBA16bit符号あり整数
			ImageFormat_RG32_F,				//!< RG32bit浮動小数
			ImageFormat_RG32_U,				//!< RG32bit符号なし整数
			ImageFormat_RG32_S,				//!< RG32bit符号あり整数
			ImageFormat_D32_F_S32_U,		//!< D32bit浮動小数 S32bit整数(ハード的には8+24bitらしい)深度ステンシル定義用
			ImageFormat_RGB10A2_UN,			//!< RGB10A2bit符号なし正規化整数
			ImageFormat_RGB10A2_U,			//!< RGB10A2bit符号なし整数
			ImageFormat_RG11B10_F,			//!< RG11B10bit浮動小数
			ImageFormat_RGBA8_UN,			//!< RGBA8bit符号なし正規化整数
			ImageFormat_RGBA8_U,			//!< RGBA8bit符号なし整数
			ImageFormat_RGBA8_SN,			//!< RGBA8bit符号あり正規化整数
			ImageFormat_RGBA8_S,			//!< RGBA8bit符号あり整数
			ImageFormat_RG16_F,				//!< RG16bit浮動小数
			ImageFormat_RG16_UN,			//!< RG16bit符号なし正規化整数
			ImageFormat_RG16_U,				//!< RG16bit符号なし整数
			ImageFormat_RG16_SN,			//!< RG16bit符号あり正規化整数
			ImageFormat_RG16_S,				//!< RG16bit符号あり整数
			ImageFormat_D32_F,				//!< D32bit浮動小数 深度定義用
			ImageFormat_R32_F,				//!< R32bit浮動小数
			ImageFormat_R32_U,				//!< R32bit符号なし整数
			ImageFormat_R32_S,				//!< R32bit符号あり整数
			ImageFormat_D24_UN_S8_U,		//!< D24bit符号なし正規化整数 S8bit整数 深度ステンシル定義用
			ImageFormat_RG8_UN,				//!< RG8bit符号なし正規化整数
			ImageFormat_RG8_U,				//!< RG8bit符号なし整数
			ImageFormat_RG8_SN,				//!< RG8bit符号あり正規化整数
			ImageFormat_RG8_S,				//!< RG8bit符号あり整数
			ImageFormat_R16_F,				//!< R16bit浮動小数
			ImageFormat_D16_UN,				//!< R16bit符号なし正規化整数 深度定義用
			ImageFormat_R16_UN,				//!< R16bit符号なし正規化整数
			ImageFormat_R16_U,				//!< R16bit符号なし整数
			ImageFormat_R16_SN,				//!< R16bit符号あり正規化整数
			ImageFormat_R16_S,				//!< R16bit符号あり整数
			ImageFormat_R8_UN,				//!< R8bit符号なし正規化整数
			ImageFormat_R8_U,				//!< R8bit符号なし整数
			ImageFormat_R8_SN,				//!< R8bit符号あり正規化整数
			ImageFormat_R8_S,				//!< R8bit符号あり整数
			ImageFormat_A8_UN,				//!< A8bit符号なし正規化整数

			ImageFormat_BC1_UN,				//!< S3TC系? DXT1?
			ImageFormat_BC2_UN,				//!< S3TC系? DXT1?
			ImageFormat_BC3_UN,				//!< S3TC系?
			ImageFormat_BC4_UN,				//!< S3TC系?
			ImageFormat_BC4_SN,				//!< S3TC系?
			ImageFormat_BC5_UN,				//!< S3TC系?
			ImageFormat_BC5_SN,				//!< S3TC系?
			ImageFormat_BC6_UF,				//!< S3TC系? 符号なし浮動小数
			ImageFormat_BC6_SF,				//!< S3TC系? 符号あり浮動小数
			ImageFormat_BC7_UN,				//!< S3TC系?

			ImageFormat_Term,
			ImageFormat_ForceDWord = 0x7fffffff
		};

		//! テクスチャのメモリ配置
		enum ImageUsageType {
			ImageUsageType_default = 0,
			ImageUsageType_dynamic,
		};

		//! テクスチャの関連付け
		enum ImageBindFlag {
			ImageBindFlag_RenderTarget = 1 << 0,
			ImageBindFlag_DepthStencil = 1 << 1,
			ImageBindFlag_StreamOut = 1 << 2,
			ImageBindFlag_ShaderResource = 1 << 3,
		};

		//! サンプラフィルタ
		enum SamplerFilterType {
			SamplerFilterType_MIN_MAG_MIP_POINT = 0,
			SamplerFilterType_MIN_MAG_POINT_MIP_LINEAR,
			SamplerFilterType_MIN_POINT_MAG_LINEAR_MIP_POINT,
			SamplerFilterType_MIN_POINT_MAG_MIP_LINEAR,
			SamplerFilterType_MIN_LINEAR_MAG_MIP_POINT,
			SamplerFilterType_MIN_LINEAR_MAG_POINT_MIP_LINEAR,
			SamplerFilterType_MIN_MAG_LINEAR_MIP_POINT,
			SamplerFilterType_MIN_MAG_MIP_LINEAR,
			SamplerFilterType_ANISOTROPIC,
			SamplerFilterType_COMPARISON_MIN_MAG_MIP_POINT,
			SamplerFilterType_COMPARISON_MIN_MAG_POINT_MIP_LINEAR,
			SamplerFilterType_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT,
			SamplerFilterType_COMPARISON_MIN_POINT_MAG_MIP_LINEAR,
			SamplerFilterType_COMPARISON_MIN_LINEAR_MAG_MIP_POINT,
			SamplerFilterType_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR,
			SamplerFilterType_COMPARISON_MIN_MAG_LINEAR_MIP_POINT,
			SamplerFilterType_COMPARISON_MIN_MAG_MIP_LINEAR,
			SamplerFilterType_COMPARISON_ANISOTROPIC,
		};

		//! サンプラのアドレスモード
		enum SamplerAddressMode {
			SamplerAddressMode_WRAP = 0,
			SamplerAddressMode_MIRROR,
			SamplerAddressMode_CLAMP,
			SamplerAddressMode_BORDER,
			SamplerAddressMode_MIRROR_ONCE,
		};

		//! サンプラのコンペアファンクション
		enum SamplerComparisonFunc {
			SamplerComparisonFunc_NEVER = 0,
			SamplerComparisonFunc_LESS,
			SamplerComparisonFunc_EQUAL,
			SamplerComparisonFunc_LESS_EQUAL,
			SamplerComparisonFunc_GREATER,
			SamplerComparisonFunc_NOT_EQUAL,
			SamplerComparisonFunc_GREATER_EQUAL,
			SamplerComparisonFunc_ALWAYS,
		};

		//! フィルモード
		enum FillMode {
			FillMode_Wire		= 0,				//!< ワイヤフレーム
			FillMode_Solid							//!< ソリッド
		};

		//! カリングモード
		enum CullMode {
			CullMode_None		= 0,				//!< カリングなし
			CullMode_Front,							//!< 正面カリング
			CullMode_Back							//!< 背面カリング
		};

		//! ブレンドデータ
		enum BlendType {
			BlendType_ZERO		= 0,				//!< 0
			BlendType_ONE,							//!< 1
			BlendType_SRC_COLOR,					//!< ピクセルシェーダ出力色
			BlendType_INV_SRC_COLOR,				//!< 1 - ピクセルシェーダ出力色
			BlendType_SRC_ALPHA,					//!< ピクセルシェーダ出力アルファ
			BlendType_INV_SRC_ALPHA,				//!< 1 - ピクセルシェーダ出力アルファ
			BlendType_DEST_ALPHA,					//!< レンダーターゲットアルファ
			BlendType_INV_DEST_ALPHA,				//!< 1 - レンダーターゲットアルファ
			BlendType_DEST_COLOR,					//!< レンダーターゲットカラー
			BlendType_INV_DEST_COLOR,				//!< 1 - レンダーターゲットカラー
			BlendType_SRC_ALPHA_SAT,				//!< クランプ付きピクセルシェーダ出力アルファ
			BlendType_BLEND_FACTOR,					//!< blend factor値を利用
			BlendType_INV_BLEND_FACTOR,				//!< 1 - blend factor値を利用
			BlendType_SRC1_COLOR,					//!<
			BlendType_INV_SRC1_COLOR,				//!<
			BlendType_SRC1_ALPHA,					//!<
			BlendType_INV_SRC1_ALPHA				//!<
		};
		//! ブレンド方法
		enum BlendOp {
			BlendOp_ADD		= 0,					//!< 加算
			BlendOp_SUBTRACT,						//!< src - dest
			BlendOp_REV_SUBTRACT,					//!< dest - src
			BlendOp_MIN,							//!< src < dest ? src : dest
			BlendOp_MAX								//!< src > dest ? src : dest
		};
		//! ブレンド処理での書き込みマスク
		enum BlendTypeMask {
			BlendTypeMask_RED		= 1 << 0,
			BlendTypeMask_GREEN	= 1 << 1,
			BlendTypeMask_BLUE	= 1 << 2,
			BlendTypeMask_ALPHA	= 1 << 3,
			BlendTypeMask_ALL	= ( ( ( BlendTypeMask_RED | BlendTypeMask_GREEN )  | BlendTypeMask_BLUE )  | BlendTypeMask_ALPHA )
		};
		//! 深度比較
		enum DepthComparisonType {
			DepthComparisonType_NEVER	= 0,		//!< 常に失敗
			DepthComparisonType_LESS,				//!< 未満の時成功
			DepthComparisonType_EQUAL,				//!< 同じ時成功
			DepthComparisonType_LESS_EQUAL,			//!< 以下の時成功
			DepthComparisonType_GREATER,			//!< より大きい時成功
			DepthComparisonType_NOT_EQUAL,			//!< 異なる時成功
			DepthComparisonType_GREATER_EQUAL,		//!< 以上の時成功
			DepthComparisonType_ALWAYS				//!< 常に成功
		};
		//! ステンシル処理
		enum StencilOp {
			StencilOp_KEEP	= 0,					//!< 何もしない
			StencilOp_ZERO,							//!< 0にする
			StencilOp_REPLACE,						//!< 置き換える
			StencilOp_INCR_SAT,						//!< クランプ付きインクリメント
			StencilOp_DECR_SAT,						//!< クランプ付きデクリメント
			StencilOp_INVERT,						//!< 反転
			StencilOp_INCR,							//!< インクリメント
			StencilOp_DECR,							//!< デクリメント
		};

		//! 深度書き込みマスク
		enum DepthWriteMaskFlag {
			DepthWriteMaskFlag_ZERO	= 0,			//!< 書き込みを行わない
			DepthWriteMaskFlag_ALL,					//!<
		};

		//! プリミティブトポロジー
		enum PrimitiveTopologyType {
			PrimitiveTopologyType_PointList = 0,	//!< 頂点リスト
			PrimitiveTopologyType_LineList,			//!< 線分リスト
			PrimitiveTopologyType_LineStrip,		//!< 線分ストリップ
			PrimitiveTopologyType_TriangleList,		//!< 三角形リスト
			PrimitiveTopologyType_TriangleStrip,	//!< 三角形ストリップ
			PrimitiveTopologyType_LineListADJ,		//!< 線分リスト+隣接データ
			PrimitiveTopologyType_LineStripADJ,		//!< 線分ストリップ+隣接データ
			PrimitiveTopologyType_TriangleListADJ,	//!< 三角形リスト+隣接データ
			PrimitiveTopologyType_TriangleStripADJ,	//!< 三角形ストリップ+隣接データ
		};

		//! 頂点レイアウトデータ種類
		enum InputLayoutFormat {
			InputLayoutFormat_Float = 0,			//!< r_f32
			InputLayoutFormat_FVec2,				//!< r_f32[2]
			InputLayoutFormat_FVec3,				//!< r_f32[3]
			InputLayoutFormat_FVec4,				//!< r_f32[4]
			InputLayoutFormat_UByte4,				//!< r_ui8[4]
			InputLayoutFormat_UNorm4,				//!< r_f32[4]	<-	r_ui8[4]
			InputLayoutFormat_SNorm4,				//!< r_f32[4]	<-	r_si8[4]
		};

		//! 深度クリアフラグ
		enum ClearDepthFlag {
			ClearDepthFlag_Depth		= 1 << 0,
			ClearDepthFlag_Stencil	= 1 << 1,
		};

		//! ビューポート
		/*!
		*/
		struct ViewPortInfo {
			ViewPortInfo() {
			}
			ViewPortInfo ( r_f32 _x, r_f32 _y, r_f32 _width, r_f32 _height, r_f32 _minDepth, r_f32 _maxDepth )
				:
				x ( _x ), y ( _y ), width ( _width ), height ( _height ), minDepth ( _minDepth ), maxDepth ( _maxDepth ) {
			}
			r_f32	x;				//!< ビューポートの左上X座標
			r_f32	y;				//!< ビューポートの左上Y座標
			r_f32	width;			//!< ビューポートの横幅
			r_f32	height;			//!< ビューポートの縦幅
			r_f32	minDepth;		//!< ビューポートのnear
			r_f32	maxDepth;		//!< ビューポートのfar
		};
	}
}

#include "../rtti/r_rtti_reflection_typename.h"
namespace r{
	namespace rtti{
		//! r::draw::ImageFormat
		template<>
		static inline
		const r_cstr	getTypeNameStr<r::draw::ImageFormat>() {
			return _RST ( "r::draw::ImageFormat" );
		}
	}
}

#endif // _R_DRAW_DEF_H_
